/*
* 1.自动装配：相当于数据库操作的极简化，只要定义了就可以直接进行数据库操作，不用再去管开启连接、关闭连接等问题
* 2.找到所有记录：使用JpaRepository的默认方法findAll()。
* 3.modelMap：用于将controller方法里面的参数传递给所需的jsp页面，以进行相关显示。
* */
package com.kpmg.questionnaire.controller;

import com.kpmg.questionnaire.model.UserEntity;
import com.kpmg.questionnaire.repository.UserRepository;
import com.kpmg.questionnaire.service.IUserService;
import com.kpmg.questionnaire.utils.WebConstants;
import com.kpmg.questionnaire.utils.WebUtils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

/**
 * Created by xionghao on 2016/11/6.
 */

@Controller
public class MainController {

    // 自动装配数据库接口，不需要再写原始的Connection来操作数据库
    @Autowired
    UserRepository userRepository;

    @Autowired
    IUserService userService;

    //    首页
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String index(){
        return "index";
    }

    // login
    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String login() {
        return "login";
    }

    @RequestMapping(value="/loginAction", method = RequestMethod.POST)
    public String loginAction(HttpServletRequest request, ModelAndView mv, String email, String password){
        UserEntity user = userService.findByEmailAndPassword(email, password);
        if(null != user){
            request.getSession().setAttribute(WebConstants.SESSION_USER_KEY, user);

            if(user.getType().equalsIgnoreCase("admin")){
                return "redirect:/question/";
            }else{
                return "redirect:/question/list/225";
            }
        }else{
            mv.addObject("errorMsg", "Illegal access");
            return "/login";
        }
    }

    // 用户管理
    @RequestMapping(value = "/user", method = RequestMethod.GET)
    public String getUsers(ModelMap modelMap) {
        // 查询user表中所有记录
        List<UserEntity> userList = userRepository.findAll();

        // 将所有记录传递给要返回的jsp页面，放在userList当中
        modelMap.addAttribute("userList", userList);

        // 返回pages目录下的admin/users.jsp页面
        return "user/userManage";
    }

    // 添加用户表单页面
    @RequestMapping(value = "/user/addUser", method = RequestMethod.GET)
    public String addUser(){
        return "user/addUser";
    }

    // 添加用户处理
    @RequestMapping(value = "/user/addUserPost", method = RequestMethod.POST)
    public String addUserPost(@ModelAttribute("user") UserEntity userEntity){
        // 向数据库添加一个用户
        //userRepository.save(userEntity);

        // 向数据库添加一个用户，并将内存中缓存区的数据刷新，立即写入数据库，之后才可以进行访问读取
        userRepository.saveAndFlush(userEntity);

        // 返回重定向页面
        return "redirect:/user";
    }

    // 查看用户详细信息
    // @PathVariable可以收集url中的变量，需匹配的变量用{}括起来
    // 例如：访问 localhost:8080/showUser/1 ，将匹配 userId = 1
    @RequestMapping(value = "/user/showUser/{userId}", method = RequestMethod.GET)
    public String showUser(@PathVariable("userId") Integer userId, ModelMap modelMap ){
        UserEntity userEntity = userRepository.findOne(userId);
        modelMap.addAttribute("user", userEntity);
        return "user/userDetail";
    }

    // 更新用户信息页面
    @RequestMapping(value = "/user/updateUser/{userId}", method = RequestMethod.GET)
    public String updateUser(@PathVariable("userId") Integer userId, ModelMap modelMap){
        UserEntity userEntity = userRepository.findOne(userId);
        modelMap.addAttribute("user", userEntity);
        return "user/updateUser";
    }
    // 处理用户修改请求
    @RequestMapping(value = "/user/updateUserPost", method = RequestMethod.POST)
    public String updateUserPost(@ModelAttribute("user") UserEntity userEntity){
        userRepository.updateUser(
                userEntity.getEmail(),
                userEntity.getFirstName(),
                userEntity.getLastName(),
                userEntity.getPassword(),
                userEntity.getType(),
                userEntity.getTitle(),
                userEntity.getId()
        );
        return "redirect:/user";
    }

    // 删除用户
    @RequestMapping(value = "/user/deleteUser/{userId}", method = RequestMethod.GET)
    public String deleteUser(@PathVariable("userId") Integer userId){
        // 删除id为userId的用户
        userRepository.delete(userId);
        // 立即刷新数据库
        userRepository.flush();
        return "redirect:/user";
    }
}